#include <string>
#include <cstdio>
#include "use_printf.h"
#include "at32f413.h"

void Usart::init(void)
{
	/* 定义 GPIO 初始化结构体 */
	gpio_init_type gpio_init_struct;

	/* 使能 GPIOA 外设时钟 PA10->RX PA9->TX */
	crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
	crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

	/* 设置默认参数 */
	gpio_default_para_init(&gpio_init_struct);

	/* configure the usart1 tx pin */
	gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
	gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
	gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
	gpio_init_struct.gpio_pins = GPIO_PINS_9;
	gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
	gpio_init(GPIOA, &gpio_init_struct);

	/* configure usart1 param */
	usart_init(USART1, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
	usart_parity_selection_config(USART1, USART_PARITY_NONE);
	usart_transmitter_enable(USART1, TRUE);
	usart_receiver_enable(USART1, TRUE);
	usart_enable(USART1, TRUE);
}

void Usart::printStr(std::string _str)
{
	for (char c : _str)
	{
		while (usart_flag_get(USART1, USART_TDBE_FLAG) == RESET)
		{
		}
		usart_data_transmit(USART1, c);
	}
	while (usart_flag_get(USART1, USART_TDBE_FLAG) == RESET)
	{
	};
	usart_data_transmit(USART1, '\n');
}

void Usart::printInt(int _value)
{
	char tmp[30];
	sprintf(tmp, "%d", _value);
	printStr(tmp);
}
void Usart::printFloat(float _value)
{
	char tmp[30];
	sprintf(tmp, "%.4f", _value);
	printStr(tmp);
}
void Usart::printDouble(double _value)
{
	char tmp[30];
	sprintf(tmp, "%.4lf", _value);
	printStr(tmp);
}